import axios from 'axios';
import jsonp from 'assets/js/jsonp';
import { SUCC_CODE, TIMEOUT, HOME_RECOMMEND_PAGE_SIZE, jsonpOptions} from './config';

// 打乱获取数组顺序
const  shuffle = (arr) => {
  const arrLength = arr.length;
  let i = arrLength;
  let rndNum;

  while (i--) {
    // 如果当前的索引与随机索引不相等，就交换数组里该两个值位置
    if (i !== (rndNum = Math.floor(Math.random() * arrLength))) {
      [arr[i], arr[rndNum]] = [arr[rndNum], arr[i]];
    }
  }

  return arr;
};

// 获取幻灯片数据 --ajax
export const getHomeSlider = () => {
  // timeout 请求超时
  return axios.get('http://www.imooc.com/api/home/slider', {
    timeout: TIMEOUT
  }).then(res => {
    // console.log(res);
    // SUCC_CODE 成功后的状态码
    if (res.data.code === SUCC_CODE) {
      // 数据获取成功后（10张图片），将数据打乱顺序，随机取值
      // 每次刷新，获取不同的数据，相当于更新
      let sliders = res.data.slider;
      // slider 包含一个图片的数组
      const slider = [sliders[Math.floor(Math.random() * sliders.length)]];
      // filter 遍历数组sliders，(50%概率)返回真保留数据，返回假删除。
      // 随机生成几张照片，然后赋值给sliders
      sliders = shuffle(sliders.filter(() => Math.random() >= 0.5));
      if (sliders.length === 0) {
        sliders = slider;
      }
      // console.log(sliders);
      return sliders;
    }
    // 数据获取失败的时候：返回数据code不为0，网络错误，请求超时
    // 抛出错误提示
    throw new Error('没有成功获取到数据! ');
  // 错误捕获
  }).catch(err => {
    if (err) {
      console.log(err);
    }
    // 超时的时候，显示超时404图片
    return [
      {
        linkUrl: 'http://www.imooc.com',
        picUrl: require('assets/img/404.png')
      }
    ];
  });
  // .then(data => { // 测试
  //   // 延迟1秒获取数据
  //   return new Promise(resolve => {
  //     setTimeout(() => {
  //       resolve(data);
  //     }, 1000);
  //   });
  // });
};

// 获取热门推荐数据 --jsonp
// 参数：一页，20条数据
export const getHomeRecommend = (page = 1, psize = HOME_RECOMMEND_PAGE_SIZE) => {
  const url = 'https://ju.taobao.com/json/tg/ajaxGetItemsV2.json';
  const params = {
    page,
    psize,
    type: 0,
    frontCatId: ''
  };

  return jsonp(url, params, jsonpOptions).then(res => { // 数据获取成功后执行的函数
    // console.log(res);
    if (res.code === '200') {
      return res;
    }

    throw new Error('没有成功获取数据!');
  }).catch(err => {
    if (err) {
      console.log(err);
    }
  });
  // .then(data => { // 测试
  //   return new Promise(resolve => {
  //     setTimeout(() => {
  //       resolve(data);
  //     }, 1000);
  //   });
  // });
};
